// 导入依赖包
import koa from "koa";
import cors from "@koa/cors";
import bodyparser from "koa-bodyparser";
import Router from "koa-router";
import { Op, Sequelize, DataTypes } from "sequelize"

// 创建 sequelize 实例
const sequelize = new Sequelize('test', 'root', '123456', {
    dialect: "mysql"
})

// 创建模型
const Student = sequelize.define('students', {
    // 学生姓名
    studentName: {
        type: DataTypes.STRING
    },
    // 学生性别
    studentSex: {
        type: DataTypes.STRING
    },
    // 学生年龄
    studentAge: {
        type: DataTypes.INTEGER
    },
    // 所在班级
    className: {
        type: DataTypes.STRING
    }
})

// 同步数据库
// sequelize.sync();

// 插入数据

await Student.create({
    // 学生姓名
    studentName: "张三",
    // 学生性别
    studentSex: "男",
    // 学生年龄
    studentAge: 18,
    // 所在班级
    className: "222班级"
})

// 创建 koa 实例
const app = new koa();

// 解决跨域问题
app.use(cors());

// 请求体解析
app.use(bodyparser());

// 创建路由实例
const router = new Router();

/** 路由方法 */
// 查询所有学生
router.get('/students', async (ctx, netx) => {
    // 查询关键词
    const keyWord = ctx.query.keyWord;

    // 条件对象
    let where;

    if (keyWord) {
        where = {
            [Op.or]: {
                // 学生姓名
                studentName: {
                    [Op.like]: `%${keyWord}%`
                },
                // 学生性别
                studentSex: {
                    [Op.like]: `%${keyWord}%`
                },
                // 学生年龄
                studentAge: {
                    [Op.eq]: keyWord
                },
                // 所在班级
                className: {
                    [Op.like]: `%${keyWord}%`
                }
            }
        }
    } else {
        where = null;
    }

    // 查询数据库
    const students = await Student.findAll({ where })

    // 成功状态码
    ctx.status = 200;

    // 响应内容
    ctx.body = {
        code: 200,
        data: students,
        msg: "查询成功"
    }
})

// 查询一个学生
router.get('/students/:id', async (ctx, netx) => {
    // 查询关键词
    const keyWord = ctx.query.keyWord;

    // 获取 id
    const id = ctx.params.id

    // 查询学生
    const student = await Student.findByPk(id)

    // 成功状态码
    ctx.status = 200;

    // 响应内容
    ctx.body = {
        code: 200,
        data: student,
        msg: "查询成功"
    }
})

// 新增一个学生
router.post('/students', async (ctx, netx) => {
    // 获取学生对象
    const obj = ctx.request.body;

    // 新增学生
    await Student.create(obj)

    // 成功状态码
    ctx.status = 200;

    // 响应内容
    ctx.body = {
        code: 200,
        data: null,
        msg: "新增成功"
    }
})

// 修改一个学生
router.put('/students/:id', async (ctx, netx) => {
    // 获取 id
    const id = ctx.params.id

    // 获取学生对象
    const obj = ctx.request.body;

    // 修改学生
    await Student.update(obj, { where: { id } })

    // 成功状态码
    ctx.status = 200;

    // 响应内容
    ctx.body = {
        code: 200,
        data: null,
        msg: "修改成功"
    }
})

// 删除一个学生
router.delete('/students/:id', async (ctx, netx) => {
    // 获取 id
    const id = ctx.params.id

    // 删除学生
    await Student.destroy({ where: { id } })

    // 成功状态码
    ctx.status = 200;

    // 响应内容
    ctx.body = {
        code: 200,
        data: null,
        msg: "删除成功"
    }
})

// 注册路由
app.use(router.routes())

// 服务端口
const appPort = 8000;

// 监听端口
app.listen(appPort);

console.log(`当前服务运行在：http://localhost:${appPort}`);
